/*
 * Copyright (c) 2013-2018 上海汇数数据. All rights reserved.
 * @(#) SymmetricCipherParams.java 2018-08-06 17:26
 */

package cn.jh.common.core.crypto;

import org.inferred.freebuilder.FreeBuilder;


/**
 * 对称加密算法参数数据。
 *
 * @author Fuchun
 * @since 1.0
 */
@FreeBuilder
public abstract class SymmetricCipherParams extends CipherParams {

    /** 初始化向量的大小。*/
    public abstract int getIvSize();

    /**
     * 是否根据密钥生成固定的向量。此配置的优先级高于 {@code generateIv}。
     */
    public abstract boolean isUseFixedIvByKey();

    /** 是否自动生成向量。*/
    public abstract boolean isGenerateIv();

    /**
     * 是否添加前置向量。
     * 如果此值设置为{@code true}，则每次{@code encrypt} 数据时，先将生成的向量添加至数据前缀，再进行{@code encrypt}，
     * 而解析时，则先取出前置的IV，再进行{@code decrypt}；
     */
    public abstract boolean isPrependIv();

    public static class Builder extends SymmetricCipherParams_Builder {

        public Builder() {
            setProvider(CipherKt.SUN_JCE);
            setStreamingBufferSize(CipherKt.DEFAULT_STREAMING_BUFFER_SIZE);

            setIvSize(CipherKt.DEFAULT_KEY_SIZE);
            // 默认不使用根据密钥生成的固定向量。
            setUseFixedIvByKey(false);
            // 默认自动生成向量，并且添加前置向量
            setGenerateIv(true);
            setPrependIv(true);
        }

        public Builder useFixedIvByKey() {
            return setUseFixedIvByKey(true);
        }

        public Builder notGenerateIv() {
            return setGenerateIv(false);
        }

        public Builder notPrependIv() {
            return setPrependIv(false);
        }

        public Builder useDefaultSecureRandom() {
            return setSecureRandom(CipherKt.getDefaultSecurRandom());
        }
    }
}
